package com.smdk.dsminio.controller;

import cn.hutool.log.StaticLog;
import com.smdk.dsminio.apiservice.FileService;
import com.smdk.dsminio.redis.RedisUtil;
import com.smdk.dsminio.utils.AjaxResult;
import com.smdk.dsminio.utils.Constants;
import com.smdk.dsminio.vo.MultipartFileParam;
import io.swagger.annotations.Api;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

/**
 * @author 神秘的凯
 * @version 1.0
 * @className FileUploadController
 * @date 2020/11/20/020 15:07
 * @Description 描述
 */
@Api(tags = {"FileUploadController"})
@RestController
@RequestMapping("/api/")
public class FileUploadController {
    @Autowired
    private RedisUtil REDISUTILS;
    @Autowired
    private FileService fileService;

    /**
     * 秒传判断，断点判断
     *
     * @return
     */
    @RequestMapping(value = "checkFileMd5", method = RequestMethod.POST)
    public AjaxResult checkFileMd5(String md5) throws IOException {
        REDISUTILS.hdel(Constants.FILE_UPLOAD_STATUS ,md5);
        //判断文件是否上传过
        String fileIsUpload = REDISUTILS.hget(Constants.FILE_UPLOAD_STATUS, md5);
        //没有上传
        if (fileIsUpload == null) {
            return AjaxResult.fail("该文件没有上传过", 101);
        }
        boolean processing = Boolean.parseBoolean(fileIsUpload);
        String value = REDISUTILS.get(Constants.FILE_MD5_KEY + md5);
        //文件已经上传过
        if (processing) {
            return AjaxResult.fail("文件已存在！", 100);
        }
        File confFile = new File(value);
        byte[] completeList = FileUtils.readFileToByteArray(confFile);
        List<String> missChunkList = new LinkedList<>();
        for (int i = 0; i < completeList.length; i++) {
            if (completeList[i] != Byte.MAX_VALUE) {
                missChunkList.add(String.valueOf(i));
            }
        }
        return AjaxResult.fail(missChunkList, "文件已存在！", 102);
    }

    /**
     * 文件节点分发
     * 1.@RequestPart这个注解用在multipart/form-data表单提交请求的方法上。
     * 2.支持的请求方法的方式MultipartFile，属于Spring的MultipartResolver类。这个请求是通过http协议传输的。
     * 3.@RequestParam也同样支持multipart/form-data请求。
     * 4.他们最大的不同是，当请求方法的请求参数类型不再是String类型的时候。
     * 5.@RequestParam适用于name-valueString类型的请求域，@RequestPart适用于复杂的请求域（像JSON，XML）。
     * @param multipartFileParam
     * @return
     * @throws IOException
     */
    @RequestMapping(value = "fileNodeDistribute", method = RequestMethod.POST)
    public AjaxResult fileNodeDistribute(MultipartFileParam multipartFileParam){
        StaticLog.info("=======>参数"+multipartFileParam.toString());
        AjaxResult uploadResult = fileService.uploadFileInfo(multipartFileParam);
        return uploadResult;
    }
}
